package chapter19;

import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import utils.ContextUtils;

import javax.naming.Context;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Darkness Shadow
 * @description: Redis基础事务
 * @date 2019/12/11 22:29
 */
public class Demo1 {

    public static void main(String [] args){
        baseTranByLambda();
    }

    public static void baseTranByLambda(){
        RedisTemplate redisTemplate = ContextUtils.getBean("redisTemplate");
        String value = (String)redisTemplate.execute(ContextUtils.getCallback());
        System.out.println(value);
    }

    /**
     * 通过创建一个匿名内部类实现SessionCallback接口，在这个接口里面可以实现操作多个命令保持是同一个
     * Redis连接，然后开启事务，将redis命令放入到队列中，然后使用连接进行执行队列里面的命令
     */
    public static void baseTranByNew(){
        RedisTemplate redisTemplate = ContextUtils.getBean("redisTemplate");

        SessionCallback sessionCallback = new SessionCallback() {
            @Override
            public Object execute(RedisOperations redisOperations) throws DataAccessException {
                // 开启事务
                redisOperations.multi();
                // 将要执行的命令放入到队列中
                redisOperations.opsForValue().set("key2", "value2");
                Map map = new HashMap();
                map.put("李姣", "加油，你会成为变得更加优秀有钱多金");
                map.put("李姣啊", "加油，你会实现你的梦想");
                map.put("李姣啊啊", "加油，有一天你会站在硅谷最高的黑客比赛中");
                redisOperations.opsForHash().putAll("belive", map);
                redisOperations.exec();
                Map belive = redisOperations.opsForHash().entries("belive");
                String str = "" + belive.get("李姣") + belive.get("李姣啊") + belive.get("李姣啊啊");
                System.out.println(str);
                return str;
            }
        };

        String execute = (String) redisTemplate.execute(sessionCallback);
        System.out.println(execute);
    }
}
